import axios from 'axios';

const download0 = (data: Blob, fileName: string, mineType: string) => {
    // 创建 blob
    const blob = new Blob([data], { type: mineType });
    // 创建 href 超链接，点击进行下载
    window.URL = window.URL || window.webkitURL;
    const href = URL.createObjectURL(blob);
    const downA = document.createElement('a');
    downA.href = href;
    downA.download = fileName;
    downA.click();
    // 销毁超连接
    window.URL.revokeObjectURL(href);
};

const download1 = async (url: string) => {
    const response = await axios({
        url, //接口
        method: 'GET',
        responseType: 'blob' //重要
    });
    const blob = new Blob([response.data]);
    return blob;
};

const DownloadUtil = {
    // 下载 Excel 方法
    excel: (url: string, fileName: string) => {
        download1(url).then((resData: Blob) => {
            download0(resData, fileName, 'application/vnd.ms-excel');
        });
    },
    // 下载 Word 方法
    word: (url: string, fileName: string) => {
        download1(url).then((resData: Blob) => {
            download0(resData, fileName, 'application/msword');
        });
    },
    // 下载 pdf 方法
    pdf: (url: string, fileName: string) => {
        download1(url).then((resData: Blob) => {
            download0(resData, fileName, 'application/pdf');
        });
    },
    // 下载 json || geojson 方法
    json: (url: string, fileName: string) => {
        download1(url).then((resData: Blob) => {
            download0(resData, fileName, 'application/geo+json');
        });
    },
    // 下载 txt 方法
    txt: (url: string, fileName: string) => {
        download1(url).then((resData: Blob) => {
            download0(resData, fileName, 'text/plain;charset=utf-8');
        });
    },
    // 下载 Markdown 方法
    markdown: (url: string, fileName: string) => {
        download1(url).then((resData: Blob) => {
            download0(resData, fileName, 'text/markdown');
        });
    },
    // 下载 Zip 方法
    zip: (url: string, fileName: string) => {
        download1(url).then((resData: Blob) => {
            download0(resData, fileName, 'application/zip');
        });
    },
    // 下载图片（允许跨域）
    image: (
        url: string,
        imageName: string,
        imageType?: string, // 图片的MIME类型(一般指文件名的后缀)，参考https://www.iana.org/assignments/media-types/media-types.xhtml#image
        canvasWidth?: number, // 指定画布宽度
        canvasHeight?: number, // 指定画布高度
        drawWithImageSize?: boolean // 将图片绘制在画布上时带上图片的宽高值, 默认是要带上的
    ) => {
        const image = new Image();
        image.setAttribute('crossOrigin', 'anonymous');
        image.src = url;
        image.onload = () => {
            const canvas = document.createElement('canvas');
            canvas.width = canvasWidth || image.width;
            canvas.height = canvasHeight || image.height;
            const ctx = canvas.getContext('2d') as CanvasRenderingContext2D;
            ctx?.clearRect(0, 0, canvas.width, canvas.height);
            if (drawWithImageSize) {
                ctx.drawImage(image, 0, 0, image.width, image.height);
            } else {
                ctx.drawImage(image, 0, 0);
            }

            imageType === 'tif' && (imageType = 'tiff')
            const url = canvas.toDataURL('image/' + imageType || imageName.split('.')[1]);
            const a = document.createElement('a');
            a.href = url;
            a.download = imageName;
            a.click();
        };
    }
};

export default DownloadUtil;
